﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using rent_car.Manejadores;

namespace rent_car.Gui
{
    public partial class FormRentaVehiculos : Form
    {
        private ManejadorDeClientes mc;

        private usuario usuarioActual;

        private cliente clienteArental;

        private vehiculo vehiculoArental;

        private renta rentaActual;

        private byte contadorVehiculos;

        private detalles_renta detalleRenta;

        private ValidadorDeFormularios vf;

        public vehiculo VehiculoArental
        {
            get { return vehiculoArental; }
            set { vehiculoArental = value; }
        }

        public cliente ClienteArental
        {
            get { return clienteArental; }
            set { clienteArental = value; }
        }

      
        public FormRentaVehiculos()
        {
            InitializeComponent();
            mc = ManejadorDeClientes.getInstancia();
            // txtUsuario.Text = usuarioActual.usuario1;
            iniciarRenta();
            detalleRenta = new detalles_renta();
            vf = new ValidadorDeFormularios();         
        }

        private void iniciarRenta()
        {
            rentaActual = new renta();
            rentaActual.usuario = UsuarioActual;
            rentaActual.estado = false;
            rentaActual.fecha = dtFecha.Value;
            rentaActual.precio_total = 00.0M;
        }

        public usuario UsuarioActual
        {
            get { return usuarioActual; }
            set { usuarioActual = value; }
        }


        private void txtBusquedaCliente_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                try
                {
                    //ver que uso tiene tener un cliente de variable de instancia
                    ClienteArental = mc.GetClientePorIdentificador(FiltradorDeCampos.filtrarNumeros("()- ", txtBusquedaCliente.Text));
                    rellenarCamposClientes(ClienteArental);
                    rentaActual.cliente = ClienteArental;
                    habilitarRangoFechas();
                    habilitarRenta();
                }
                catch (NullReferenceException nre)
                {
                    MessageBox.Show("Cliente no encontrado por licencia o telefono, verifique");
                }
            }
        }

        private void habilitarRenta() {
            txtDolar.Enabled = true;
            txtDeposito.Enabled = true;
            txtTotal.Enabled = true;
        }

        private void desabilitarRenta() {
            txtDolar.Enabled = false;
            txtDeposito.Enabled = false;
            txtTotal.Enabled = false;
        }

        private void habilitarRangoFechas() {
            dtDesde.Enabled = true;
            dtHasta.Enabled = true;
        }

        private void desabilitarRangoFechas()
        {
            dtDesde.Enabled = false;
            dtHasta.Enabled = false;
        }

        private void rellenarCamposClientes(cliente clnt)
        {
            txtNombre.Text = clnt.persona.nombre;
            txtApellido.Text = clnt.persona.apellido;
            txtTelefono.Text = clnt.persona.telefono;
            txtCelular.Text = clnt.persona.celular;
            if (clnt.persona.ciudade != null)
            {
                txtCiudad.Text = clnt.persona.ciudade.nombre;
            }
            txtLicencia.Text = clnt.persona.no_lic;
            txtExpLic.Text = String.Format("{0:dddd,d MMMM , yyyy}", clnt.persona.fecha_exp_lic);
            if (clnt.compania != null)
            {
                txtCompania.Text = clnt.compania.nombre;
                txtTelComp1.Text = clnt.compania.telefono1;
                txtTelComp2.Text = clnt.compania.telefono2;
            }
        }

        private void dtHasta_ValueChanged(object sender, EventArgs e)
        {
            verDias();
        }

        private void verDias()
        {
            TimeSpan ts = Convert.ToDateTime(dtHasta.Text) - Convert.ToDateTime(dtDesde.Text);
            if (ts.Days < 0)
            {
                MessageBox.Show("La fecha \"HASTA\" no puede ser menor que la fecha \"DESDE\"!!");
                dtHasta.Value = dtDesde.Value;
                return;
            }
            txtDias.Text = ts.Days.ToString();
        }

        private void FormRentaVehiculos_Load(object sender, EventArgs e)
        {
            verDias();
        }


        private void btnCambioVehiculo_Click(object sender, EventArgs e)
        {
            if (clienteArental == null)
            {
                MessageBox.Show(null, "Debe especificar el cliente antes de escoger el vehiculo a rentar", "Advertencia");
            }
            else
            {
                FormVehiculosDisponibles vd = new FormVehiculosDisponibles();
                vd.ShowDialog(this);
                if (vd.VehiculoSelecionado != null)
                {
                    VehiculoArental = vd.VehiculoSelecionado;
                    txtModelo.Text = VehiculoArental.modelo;
                    txtAno.Text = VehiculoArental.ano;
                    if (VehiculoArental.marca != null)
                    {
                        txtMarca.Text = VehiculoArental.marca.descripcion;
                    }
                    txtMotor.Text = VehiculoArental.motor;
                    txtTransmision.Text = VehiculoArental.transmision;
                    txtPlaca.Text = VehiculoArental.placa;
                    contadorVehiculos++;
                    lblCantidad.Text = contadorVehiculos.ToString();
                }
            }
        }

        private void BtnAceptar_Click(object sender, EventArgs e)
        {
            if (ClienteArental == null)
            {
                MessageBox.Show("Debe espeficicar el cliente a quien va a rental");
            }
            else if (VehiculoArental == null)
            {
                MessageBox.Show("Debe espeficicar el vehiculo que sera rentado");
            }
            else
            {
                if (!txtDeposito.Text.Equals(""))
                {
                    rentaActual.deposito = Convert.ToDecimal(txtDeposito.Text);
                }
                actualizarRenta();
                if (txtCostoUnit.Text.Equals("00.0$"))
                {
                    MessageBox.Show("No ha confirmado el costo de esta renta\nNOTA:Verifique que el SUBTOTAL tenga el costo de la renta ");
                    return;
                }
                if (!txtDolar.Text.Equals(""))
                {
                    txtTotalUsd.Text = Math.Round((Convert.ToDouble(txtTotalRenta.Text.Replace("$", "")) / Convert.ToDouble(txtDolar.Text)), 3).ToString() + "$";
                }
                periodo_renta periodo = new periodo_renta()
                {
                    fecha_desde = dtDesde.Value,
                    fecha_hasta =  dtHasta.Value,
                    cant_dias = int.Parse(txtDias.Text),
                    precio = rentaActual.precio_total                    
                };
                rentaActual.periodo_renta = periodo;
                ControlRenta.GetInstancia().rentar(rentaActual);
                limipiarCampos();
                txtBusquedaCliente.ReadOnly = false;
                MessageBox.Show("Renta realizada con exitos!!!");
            }
        }

        private void actualizarRenta()
        {
            detalleRenta.renta = rentaActual;
            detalleRenta.vehiculo = vehiculoArental;
            rentaActual.detalles_rentas.Add(detalleRenta);
            rentaActual.precio_total += detalleRenta.precio;
            txtTotalRenta.Text = rentaActual.precio_total.ToString() + "$";
        }

        private void limipiarCampos() {
            clienteArental = null;
            vehiculoArental = null;           
            vf.LimpiarCampos(gbDatosVehiculo, gbDatosPersonales);
            txtBusquedaCliente.Text = "";
            limpiarCamposUnitarios();
            txtTotalRenta.Text = "00.0$";
            txtTotalUsd.Text = "00.0$";
            lblCantidad.Text = "0";
            contadorVehiculos++;
            dtDesde.Value = dtFecha.Value;
            dtHasta.Value = dtFecha.Value;
            desabilitarRangoFechas();
            desabilitarRenta();
        }

        private void limpiarCamposUnitarios()
        {
            txtTotal.Text = "";
            txtDeposito.Text = "";
            txtDolar.Text = "";
            txtCostoUnit.Text = "00.0$";
            txtCostoUnitUs.Text = "00.0$";
        }

        private void alquilarOtroVehiculo()
        {
            VehiculoArental = null;
            txtBusquedaCliente.ReadOnly = true;            
            detalleRenta = new detalles_renta();
            vf.LimpiarCampos(gbDatosVehiculo);
            limpiarCamposUnitarios();
        }

        private void txtTotal_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {               
                txtCostoUnit.Text = txtTotal.Text + ".00$";
                detalleRenta.precio = Convert.ToDecimal(txtCostoUnit.Text.Replace("$", ""));               
                txtTotalRenta.Text = rentaActual.precio_total.ToString() + "$";
            }
        }

        private void maskedTextBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (!txtTotal.Text.Equals(""))
                {
                    txtCostoUnitUs.Text = Math.Round((Convert.ToDouble(txtTotal.Text) / Convert.ToDouble(txtDolar.Text)), 3).ToString() + "$";
                }
                else
                {
                    txtCostoUnitUs.Text = (Convert.ToDouble(txtCostoUnit.Text.Replace("$", "")) / Convert.ToDouble(txtDolar.Text)).ToString() + "$";
                }
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            if (ClienteArental != null)
            {
                if (MessageBox.Show(null, "Seguro que desea cancelar esta renta?", "Advertencia", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    if (VehiculoArental != null)
                    {
                        VehiculoArental.estado = "Disponible";
                        ManejadorDeVehiculos.getInstancia().cambiarEstadoVehiculo(VehiculoArental);
                    }
                    limipiarCampos();
                    return;
                }
            }
        }

        private void btnNuevaRenta_Click(object sender, EventArgs e)
        {
            if (ManejadorDeVehiculos.getInstancia().vehiculosDisponibles().Count == 0)
            {
                MessageBox.Show(null, "No hay mas vehiculos disponibles!!!", "ALERTA");
                return;
            }
            actualizarRenta();
            alquilarOtroVehiculo();
        }

          
    }
}
